package com.javaclimb.music.datastructure;

public class SingleLinkedList {
    private int size;   //链表个数
    private Node head;   //头节点

    //定义一个内部类(类中嵌套的类)表示链表中的每个节点类
    private class Node{
        private Object date;//每个节点的数据
        private Node next;//每个节点指向下一个结点的连接

        public Node(Object date){
            this.date=date;
        }
    }

    /**
     * 实现在链表头部添加元素
     */
    public Object addHead(Object obj){
        Node newHead=new Node(obj);
        if (size==0){
            head=newHead;
        }else {
            newHead.next=head;
            head=newHead;
        }
        size++;
        return obj;
    }

    /**
     * 显示节点信息
     * @return
     */
    public void display(){
        if (size>0){
            Node node=head;
            int tempSize=size;
            if (tempSize==1){
//                如果当前列表只有一个节点
                System.out.println("["+node.date+"]");
                return;
            }
            while (tempSize>0){
                if(node.equals(head)){
                    System.out.print("["+node.date+"->");
                }else if (node.next==null){
                    System.out.println(node.date+"]");
                }else {
                    System.out.print(node.date+"->");
                }
                node=node.next;
                tempSize--;
            }
        }else {
            System.out.println("没有任何节点");
        }
    }

    public boolean delete(Object obj){
        Node node=new Node(obj);
        Node n1=head;
        boolean b=false;
        if (size==1){
            if (node.date.equals(n1.date)){
                size--;
            }
        }else if(size==0){
            b=false;
        }else {
            if (node.date.equals(n1.date)){
                head=n1.next;
                size--;
                b=true;
            }else {
                for (int i=0;i<size;i++){
                    Node n2=n1.next;
                    if (node.date.equals(n2.date)){
                        n2=n2.next;
                        n1.next=n2;
                        size--;
                        b=true;
                        break;
                    }else {
                        n1 = n1.next;
                    }
                }
            }
        }
        return b;
    }

    public void deleteHead() {
        Node n1=head;
        head=n1.next;
        size--;
    }

    public Node get(Object obj){
        Node node=head;
        for (int i=0;i<size;i++){
            if (node.date.equals(obj)){
                return node;
            }
            node=node.next;
        }
        return null;
    }

    public static void main(String[] args) {
        SingleLinkedList s=new SingleLinkedList();
//        s.addHead(12);
//        s.display();
//        s.delete(12);
//        s.display();
        s.addHead(13);
        s.addHead(14);
        s.addHead(15);
        s.display();
        s.delete(15);
        s.display();
        s.addHead(23);
        s.addHead(59);
        s.display();
        s.deleteHead();
        s.display();
        Node nn=s.get(14);
        if (nn!=null){
            System.out.println("查找成功数据为："+nn.date);
        }
    }
}
